#include "key_handler.h"
#include "esp_log.h"
#include "driver/key_driver.h"

static const char *TAG = "key_handler";

static QueueHandle_t s_key_event_queue = NULL;

/**
 * @brief 按键事件回调函数
 * 
 * @param event 按键事件
 */
static void key_event_callback(key_event_t event)
{
    /* 可以在这里添加额外的按键事件处理逻辑 */
    ESP_LOGD(TAG, "Key event callback: %d", event);
}

/**
 * @brief 按键处理任务
 * 
 * 从队列接收按键事件并处理
 * 
 * @param arg 传递给任务的参数
 */
static void key_handler_task(void* arg)
{
    key_event_t event;
    for(;;) {
        if(xQueueReceive(s_key_event_queue, &event, portMAX_DELAY)) {
            switch (event) {
                case KEY_EVENT_PRESS:
                    ESP_LOGI(TAG, "按键按下");
                    break;
                    
                case KEY_EVENT_RELEASE:
                    ESP_LOGI(TAG, "按键释放");
                    break;
                    
                case KEY_EVENT_LONG_PRESS:
                    ESP_LOGI(TAG, "按键长按");
                    break;
                    
                default:
                    break;
            }
        }
    }
}

void key_handler_init(void)
{
    // 创建队列来处理按键事件
    s_key_event_queue = xQueueCreate(10, sizeof(key_event_t));
    if (s_key_event_queue == NULL) {
        ESP_LOGE(TAG, "创建按键事件队列失败");
        return;
    }
    
    // 启动按键处理任务
    xTaskCreate(key_handler_task, "key_handler_task", 2048, NULL, 10, NULL);

    // 初始化按键驱动
    if (!key_driver_init(s_key_event_queue)) {
        ESP_LOGE(TAG, "初始化按键驱动失败");
        return;
    }
    
    // 注册按键事件回调函数
    key_driver_register_callback(key_event_callback);

    ESP_LOGI(TAG, "按键处理模块初始化完成");
}